home *** CD-ROM | disk | FTP | other *** search
/ Multimedia Producer's Bible / Multimedia Producer's Bible.iso / mac / mTropolis / mTropolis Sampler Files / mFactory Object Model Examples / Source / DrawBits / DrawBits.c next >
Encoding:
C/C++ Source or Header  |  1996-01-04  |  7.2 KB  |  286 lines  |  [TEXT/MMCC]

  1. /*    DrawBits.c
  2. **
  3. **    Copyright 1995, mFactory, Inc.
  4. **    All rights reserved.
  5. */
  6.  
  7. #include "DrawBits.h"
  8.  
  9. #define kApplyPopup            6        // DITL indices
  10. #define kRemovePopup         8
  11.  
  12. static MErr CompDrawBuffered(DrawBitsComp *self, PLUpdateSpec *drawSpec, PLOffScreenSpec *gworldSpec);
  13.  
  14.  
  15. /*    Initial entry point
  16. */
  17.  
  18. MCompMainFuncDcl MCompMainName(MInitInfo *initInfo)
  19. {
  20.     MDefineComponent(DrawBitsComp, kMCanDragOff);
  21.     MInheritClass(MComponent, kMCompNumProcs, kMBaseCompSlot);
  22.  
  23.     // MComponent methods we must override
  24.  
  25.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompConstructor, MCompConstructor);
  26.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompCopy, MCompCopy);
  27.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompCopyConstructor, MCompCopyConstructor);
  28.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompDestructor, MCompDestructor);
  29.  
  30.     // MComponent methods we choose to override
  31.  
  32.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompEditorOpen, MCompEditorOpen);
  33.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompEditorAccept, MCompEditorAccept);
  34.  
  35.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompGetSaveInfo, MCompGetSaveInfo);
  36.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompSaveComponent, MCompSaveComponent);
  37.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompRestoreComponent, MCompRestoreComponent);
  38.  
  39.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompEnabled, MCompEnabled);
  40.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompDisabled, MCompDisabled);
  41.  
  42.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompApplyEditorEffect, MCompApplyEditorEffect);
  43.  
  44.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompProcessMessage, MCompProcessMessage);
  45.  
  46.     MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompAdaptIDs, MCompAdaptIDs);
  47.  
  48.     // Introduce our own methods
  49.  
  50.     MDefineMethod(kDrawBitsSlot, kDrawBitsSlot, kDrawBuffered, CompDrawBuffered);
  51.  
  52.     MConnectCommonServices(initInfo);
  53.  
  54.     MEndComponentDef;
  55. }
  56.  
  57.  
  58. /*    Initialize component
  59. */
  60.  
  61. static MErr MCompConstructor(DrawBitsComp *self, MObjectRef *mRef)
  62. {
  63.     MInitEvent(self->f_applyEvent, kMParentEnabled, 0);
  64.     MInitEvent(self->f_removeEvent, kMNone, 0);
  65.     return kMNoCompErr;
  66. }
  67.  
  68.  
  69. /*    Copy component data
  70. */
  71.  
  72. static MErr MCompCopy(DrawBitsComp *self, DrawBitsComp *previousSelf)
  73. {
  74.     MCopyEvent(self->f_applyEvent, previousSelf->f_applyEvent);
  75.     MCopyEvent(self->f_removeEvent, previousSelf->f_removeEvent);
  76.     return kMNoCompErr;
  77. }
  78.  
  79.  
  80. /*    Copy component
  81. */
  82.  
  83. static MErr MCompCopyConstructor(DrawBitsComp *self, DrawBitsComp *previousSelf, MObjectRef *mRef)
  84. {
  85.     MCompConstructor(self, mRef);
  86.     return MCompCopy(self, previousSelf);
  87. }
  88.  
  89.  
  90. /*    Dispose component
  91. */
  92.  
  93. static MErr MCompDestructor(DrawBitsComp *self)
  94. {
  95.     MDisposeEvent(self->f_applyEvent);
  96.     MDisposeEvent(self->f_removeEvent);
  97.     return kMNoCompErr;
  98. }
  99.  
  100.  
  101. /*    Open component dialog
  102. */
  103.  
  104. static MErr MCompEditorOpen(DrawBitsComp *self, void *editor, short editorType)
  105. {
  106.     if ( editorType == kMDialogEditorType ) {
  107.         MSetEditorItem(editor, kApplyPopup, (MDataType *) &self->f_applyEvent);
  108.         MSetEditorItem(editor, kRemovePopup, (MDataType *) &self->f_removeEvent);
  109.         return kMNoCompErr;
  110.     }
  111.     else
  112.         return kMUnableToComplyCompErr;
  113. }
  114.  
  115.  
  116. /*    Close component dialog
  117. */
  118.  
  119. static MErr MCompEditorAccept(DrawBitsComp *self, void *editor)
  120. {
  121.     MGetEditorItem(editor, kApplyPopup, (MDataType *) &self->f_applyEvent);
  122.     MGetEditorItem(editor, kRemovePopup, (MDataType *) &self->f_removeEvent);
  123.     return kMNoCompErr;
  124. }
  125.  
  126.  
  127. /*    Provide save information
  128. */
  129.  
  130. static MErr MCompGetSaveInfo(DrawBitsComp *self, MFileIOServ *file, long saveInfo, short *rev, long *len)
  131. {
  132.     long    valueSize;
  133.  
  134.     MSizeOfValue(file, &self->f_applyEvent, &valueSize);
  135.     *len = valueSize;
  136.     MSizeOfValue(file, &self->f_removeEvent, &valueSize);
  137.     *len += valueSize;
  138.  
  139.     *rev = kDrawBitsRev;
  140.     return kMNoCompErr;
  141. }
  142.  
  143.     
  144. /*    Save component
  145. */
  146.  
  147. static MErr MCompSaveComponent(DrawBitsComp *self, MFileIOServ *file, long saveInfo)
  148. {
  149.     MWriteValue(file, &self->f_applyEvent);
  150.     MWriteValue(file, &self->f_removeEvent);
  151.     return kMNoCompErr;
  152. }
  153.  
  154.  
  155. /*    Restore component
  156. */
  157.  
  158. static MErr MCompRestoreComponent(DrawBitsComp *self, MFileIOServ *file ,long saveInfo, short rev)
  159. {
  160.     if ( rev == kDrawBitsRev ) {
  161.         MReadValue(file, &self->f_applyEvent);
  162.         MReadValue(file, &self->f_removeEvent);
  163.         return kMNoCompErr;
  164.     }
  165.     else
  166.         return kMUnableToComplyCompErr;
  167. }
  168.  
  169.  
  170. /*    Enable drawing in edit mode
  171. */
  172.  
  173. static MErr MCompApplyEditorEffect(DrawBitsComp *self)
  174. {
  175.     if ( MDefaultMessage(self->f_applyEvent) ) {
  176.         MObjectRef    *element;
  177.         MFunk        funk;
  178.         MInteger    mInt;
  179.  
  180.         MGetElement(&element);
  181.         MInitFunk(funk, kMBufferedDrawFunk, self, kDrawBitsSlot, kDrawBuffered, 0, 0, 0);
  182.         MInitInteger(mInt, 0);
  183.         MRegisterFunk(element, &funk, (MDataType *) &mInt);
  184.     }
  185.     return kMNoCompErr;
  186. }
  187.  
  188.  
  189. /*    Component enabled in runtime
  190. */
  191.  
  192. static MErr MCompEnabled(DrawBitsComp *self)
  193. {
  194.     MRegisterMouseFeedback(self, &self->f_applyEvent);
  195.     MRegisterMouseFeedback(self, &self->f_removeEvent);
  196.     return kMNoCompErr;
  197. }
  198.  
  199.  
  200. /*    Component disabled in runtime
  201. */
  202.  
  203. static MErr MCompDisabled(DrawBitsComp *self)
  204. {
  205.     MDeregisterMouseFeedback(self, &self->f_applyEvent);
  206.     MDeregisterMouseFeedback(self, &self->f_removeEvent);
  207.     return kMNoCompErr;
  208. }
  209.  
  210.  
  211. /*    Process incoming message
  212. */
  213.  
  214. static MErr MCompProcessMessage(DrawBitsComp *self, MMessagePtr message)
  215. {
  216.     if ( MDetectMessage(message, self->f_applyEvent) ) {
  217.         MFunk        funk;
  218.         MObjectRef    *element;
  219.         MDataType    d;
  220.  
  221.         MInitFunk(funk, kMBufferedDrawFunk, self, kDrawBitsSlot, kDrawBuffered,0,0,0);
  222.         MInitInteger(d.f_integer, 0);
  223.         MGetElement(&element);
  224.         MRegisterFunk(element, &funk, &d);
  225.         return kMNoCompErr;
  226.     }
  227.     else if ( MDetectMessage(message, self->f_removeEvent) || MDetectDisableMessage(message) ) {
  228.         MObjectRef    *element;
  229.  
  230.         MGetElement(&element);
  231.         MUnregisterFunk(element, kMBufferedDrawFunk);
  232.         return kMNoCompErr;
  233.     }
  234.     else
  235.         return kMUnableToComplyCompErr;
  236. }
  237.  
  238.  
  239. /*    Draw bits on element
  240. */
  241.  
  242. static MErr CompDrawBuffered(DrawBitsComp *self, PLUpdateSpec *drawSpec, PLOffScreenSpec *gworldSpec)
  243. {    
  244.     long    width = drawSpec->f_mediaRect->right - drawSpec->f_mediaRect->left;
  245.     long    height = drawSpec->f_mediaRect->bottom - drawSpec->f_mediaRect->top;
  246.     long    i, j;
  247.  
  248.     #ifdef _Macintosh_     
  249.         Byte *rawBits = ((Byte *) gworldSpec->f_imageBits) +
  250.             (long) drawSpec->f_mediaRect->top * gworldSpec->f_rowBytes +
  251.             drawSpec->f_mediaRect->left;
  252.  
  253.         Byte *maxPixelsAddr = ((Byte *) gworldSpec->f_imageBits) +
  254.             (long)(gworldSpec->f_surfaceRect.bottom - gworldSpec->f_surfaceRect.top) *
  255.             gworldSpec->f_rowBytes;
  256.     #elif _Windows_
  257.         Byte __huge *rawBits = ((Byte __huge *) gworldSpec->f_imageBits) +
  258.                 (long) drawSpec->f_mediaRect->top * gworldSpec->f_rowBytes +
  259.                 drawSpec->f_mediaRect->left;
  260.     
  261.         Byte __huge *maxPixelsAddr = ((Byte __huge *) gworldSpec->f_imageBits) +
  262.                 (long) (gworldSpec->f_surfaceRect.bottom - gworldSpec->f_surfaceRect.top) *
  263.                 gworldSpec->f_rowBytes;  
  264.     #endif
  265.  
  266.     for (j=0; j<height; j++) {
  267.         for (i=0; i<width; i++) {
  268.             if ( (&rawBits[i] <= maxPixelsAddr) && (&rawBits[i] >= (Byte *)gworldSpec->f_imageBits) )
  269.                 rawBits[i] = rawBits[i]+10;
  270.         }
  271.         rawBits += gworldSpec->f_rowBytes;
  272.     }
  273.     return kMNoCompErr;
  274. }
  275.  
  276.  
  277. /*    Adjust project-specific IDs
  278. */
  279.  
  280. static MErr MCompAdaptIDs(DrawBitsComp *self, MObjectPtr *sourceStore, MObjectPtr *targetStore)
  281. {
  282.     MTranslateID(kMTranslateEventID, sourceStore, targetStore, (MDataType *) &self->f_applyEvent);
  283.     MTranslateID(kMTranslateEventID, sourceStore, targetStore, (MDataType *) &self->f_removeEvent);
  284.     return kMNoCompErr;
  285. }
  286.